home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ccdl151s.zip / INCLUDE / GEN386.H < prev    next >
C/C++ Source or Header  |  1997-06-13  |  7KB  |  209 lines

  1. /*
  2.  * 68K/386 32-bit C compiler.
  3.  *
  4.  * copyright (c) 1996, David Lindauer
  5.  * 
  6.  * This compiler is intended for educational use.  It may not be used
  7.  * for profit without the express written consent of the author.
  8.  *
  9.  * It may be freely redistributed, as long as this notice remains intact
  10.  * and sources are distributed along with any executables derived from them.
  11.  *
  12.  * The author is not responsible for damages, either direct or consequential,
  13.  * that may arise from use of this software.
  14.  *
  15.  * v1.5 August 1996
  16.  * David Lindauer, gclind01@starbase.spd.louisville.edu
  17.  *
  18.  * Credits to Mathew Brandt for original K&R C compiler
  19.  *
  20.  */
  21. /*
  22.  *      code generation structures and constants
  23.  */
  24.  
  25. /* address mode specifications */
  26. #define F_DREG  1       /* data register direct mode allowed */
  27. #define F_AREG  2       /* address register direct mode allowed */
  28. #define F_MEM   4       /* memory alterable modes allowed */
  29. #define F_IMMED 8       /* immediate mode allowed */
  30. #define F_ALT   7       /* alterable modes */
  31. #define F_DALT  5       /* data alterable modes */
  32. #define F_FREG  16      /* FP register */
  33. #define F_INDX  32    /* indexed memory alterable mode allowed */
  34. #define F_ALL   31      /* all modes allowed */
  35. #define F_VOL   64      /* need volitile operand */
  36. #define F_NOVALUE 128    /* dont need result value */
  37. #define F_NOBIT 256    /* Don't get the bit val, get the address */
  38. #define F_DEST 512    /* Is going to be used as a destination */
  39.  
  40. #define OPE_MATH 1
  41. #define OPE_ARPL 2
  42. #define OPE_BOUND 3
  43. #define OPE_BITSCAN 4
  44. #define OPE_BIT 5
  45. #define OPE_CALL 6
  46. #define OPE_INCDEC 7
  47. #define OPE_RM 8
  48. #define OPE_ENTER 9
  49. #define OPE_IMUL 10
  50. #define OPE_IN 11
  51. #define OPE_IMM8 12
  52. #define OPE_RELBRA 13
  53. #define OPE_RELBR8 14
  54. #define OPE_JMP 15
  55. #define OPE_REGRM 16
  56. #define OPE_LOADSEG 17
  57. #define OPE_LGDT 18
  58. #define OPE_LIDT 19
  59. #define OPE_RM16 20
  60. #define OPE_MOV 21
  61. #define OPE_MOVSX 22
  62. #define OPE_OUT 23
  63. #define OPE_PUSHPOP 24
  64. #define OPE_SHIFT 25
  65. #define OPE_RET 26
  66. #define OPE_SET 27
  67. #define OPE_SHLD 28
  68. #define OPE_TEST 29
  69. #define OPE_XCHG 30
  70. #define OPE_FMATH 31
  71. #define OPE_FMATHP 32
  72. #define OPE_FMATHI 33
  73. #define OPE_FCOM 34
  74. #define OPE_FREG 35
  75. #define OPE_FICOM 36
  76. #define OPE_FILD 37
  77. #define OPE_FIST 38
  78. #define OPE_FLD 39
  79. #define OPE_FST 40
  80. #define OPE_FSTP 41
  81. #define OPE_FUCOM 42
  82. #define OPE_FXCH 43
  83. #define OPE_MN 44
  84. #define OPE_M16 45
  85. #define OPE_CMPS 46
  86. #define OPE_INS 47
  87. #define OPE_LODS 48
  88. #define OPE_MOVS 49
  89. #define OPE_OUTS 50
  90. #define OPE_SCAS 51
  91. #define OPE_STOS 52
  92. #define OPE_XLAT 53
  93. #define OPE_REG32 54
  94.  
  95. enum e_op { op_reserved, op_line, op_label, op_funclabel, op_seq,
  96.     op_genword,op_dd,
  97.     op_aaa,op_aad,op_aam,op_aas,op_add,op_adc,
  98.     op_and,op_arpl,op_bound,op_bsf,op_bsr,op_bswap,op_btc,
  99.     op_bt,op_bts,op_call,op_cbw,op_cwde,op_cwd,
  100.     op_cdq,op_clc,op_cld,op_cli,op_clts,op_cmc,
  101.     op_cmp,op_cmps,op_cmpsb,op_cmpsw,op_cmpsd,op_daa,
  102.     op_das,op_dec,op_div,op_enter,op_hlt,op_idiv,
  103.     op_imul,op_in,op_inc,op_ins,op_insb,op_insw,
  104.     op_insd,op_int,op_into,op_invd,op_iret,op_iretd,op_ja,
  105.     op_jnbe,op_jae,op_jnb,op_jnc,op_jb,op_jc,
  106.     op_jnae,op_jbe,op_jna,op_jecxz,op_je,op_jg,
  107.     op_jnle,op_jl,op_jnge,op_jge,op_jnl,op_jle,
  108.     op_jng,op_jne,op_jo,op_jno,op_jp,op_jpe,
  109.     op_jpo,op_js,op_jns,op_jmp,op_lahf,op_lar,
  110.     op_lds,op_les,op_lfs,op_lgs,op_lss,op_lea,
  111.     op_leave,op_lgdt,op_lidt,op_lldt,op_lmsw,op_lock,
  112.     op_lods,op_lodsb,op_lodsw,op_lodsd,op_loop,op_loope,
  113.     op_loopz,op_loopne,op_loopnz,op_lsl,op_ltr,op_mov,
  114.     op_movs,op_movsb,op_movsw,op_movsd,op_movsx,op_movzx,
  115.     op_mul,op_neg,op_not,op_nop,op_or,op_out,
  116.     op_outs,op_outsb,op_outsw,op_outsd,op_pop,op_popa,op_popad,
  117.     op_popf,op_popfd,op_push,op_pusha,op_pushad,op_pushf,op_pushfd,op_rcl,op_rcr,
  118.     op_rol,op_ror,op_rep,op_repne, op_repe, op_repnz, 
  119.     op_repz,op_ret,op_sahf,op_sal,op_sar,op_shl,
  120.     op_shr,op_sbb,op_scas,op_scasb,op_scasw,op_scasd,
  121.     op_seta,op_setnbe,op_setae,op_setnb,op_setnc,op_setb,
  122.     op_setc,op_setnae,op_setbe,op_setna,op_sete,op_setg,
  123.     op_setnle,op_setl,op_setnge,op_setge,op_setnl,op_setle,
  124.     op_setng,op_setne,op_seto,op_setno,op_setp,op_setpe,
  125.     op_setpo,op_sets,op_setns,op_sgdt,op_sidt,op_sldt,
  126.     op_smsw,op_shld,op_shrd,op_stc,op_std,op_sti,
  127.     op_stos,op_stosb,op_stosw,op_stosd,op_str,op_sub,op_test,
  128.     op_verr,op_verw,op_wait,op_wbinvd,op_xchg,
  129.     op_xlat,op_xlatb,op_xor,op_f2xm1,op_fabs,op_fadd,op_faddp,
  130.     op_fiadd,op_fchs,op_fclex,op_fnclex,op_fcom,op_fcomp,
  131.     op_fcompp,op_fcos,op_fdecstp,op_fdiv,op_fdivp,op_fidiv,
  132.     op_fdivr,op_fdivrp,op_fidivr,op_ffre,op_ficom,op_ficomp,
  133.     op_fild,op_fincstp,op_finit,op_fninit,op_fist,op_fistp,
  134.     op_fld,op_fldz,op_fldpi,op_fld1,op_fld2t,op_fld2e,op_fldlg2,
  135.     op_fldln2,op_fldcw,op_fldsw,op_fldenv,op_fmul,op_fmulp,op_fimul,
  136.     op_fpatan,op_fprem,op_fprem1,op_fptan,op_frndint, op_frstor,op_fsave,
  137.     op_fnsave,op_fscale,op_fsin,op_fsincos,op_fsqrt,op_fst,
  138.     op_fstp,op_fstcw,op_fstsw,op_fnstcw, op_fnstsw,
  139.     op_fstenv,op_fsntenv,op_fsub,
  140.     op_fsubp,op_fisub,op_fsubr,op_fsubrp,op_fisubr,op_ftst,
  141.     op_fucom,op_fucomp,op_fucompp,op_fwait,op_fxam,op_fxch,op_fxtract,
  142.     op_fyl2x,op_fyl2xp1
  143.     };
  144. enum e_asmw {
  145.     akw_byte, akw_word, akw_dword, akw_fword, akw_qword, akw_tbyte,
  146.     akw_offset, akw_ptr };
  147.  
  148. enum e_am {
  149.         am_none, am_dreg, am_freg, am_screg, am_sdreg, am_streg, am_seg,
  150.     am_indisp, am_indispscale,
  151.         am_direct, am_immed, am_ext };
  152.  
  153. /*      addressing mode structure       */
  154.  
  155. struct amode {
  156.         enum e_am       mode;
  157.         char            preg;
  158.         char            sreg;
  159.         char            tempflag;
  160.     char        scale;
  161.     char         length;
  162.     enum { e_default, e_cs,e_ds,e_es,e_fs,e_gs, e_ss } seg;
  163.         struct enode    *offset;
  164.         };
  165.  
  166. /*      output code structure   */
  167.  
  168. struct ocode {
  169.         struct ocode    *fwd, *back;
  170.         enum e_op       opcode;
  171.         struct amode    *oper1, *oper2,*oper3;
  172.     int addr;
  173.     int size;
  174.     char diag;
  175.     char noopt;
  176.         };
  177.  
  178. /* Used for fixup gen */
  179. typedef struct dl {
  180.         struct dl *next;
  181.         char *string;
  182.         int offset;
  183.         short type;
  184. } DATALINK;
  185.  
  186. #define AMODE struct amode
  187. #define OCODE struct ocode
  188.  
  189. #define FLOAT printf("codegen-Floating point not implemented in push/pop\n");
  190. /* 386 register set */
  191. #define EAX 0
  192. #define ECX 1
  193. #define EDX 2
  194. #define EBX 3
  195. #define ESP 4
  196. #define EBP 5
  197. #define ESI 6
  198. #define EDI 7
  199. #define AL 0
  200. #define CL 1
  201. #define DL 2
  202. #define BL 3
  203. #define ES 0
  204. #define CS 1
  205. #define SS 2
  206. #define DS 3
  207.  
  208.  
  209. #include "cc386.p"